﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Data;
using System.Web.UI.WebControls;
using vudu.EnlaceDatos.SqlServer;
using vudu.Logica.Clases;
using vudu.PaginasWeb.G6Pensum;

namespace vudu.PaginasWeb.G6Pensum
{
    public partial class ModificarPensum2 : System.Web.UI.Page
    {
        //Se instancian los objetos que seran utilizados en la clase
        //Lista de materias que prelan una materia
        List<Materia> listaMateria = new List<Materia>();
        //Lista de materias del pensum 
        List<Prelacion> misMateriasPensum = new List<Prelacion>();
        Prelacion miPrelacion = new Prelacion();
        SqlServerPensum miServer = new SqlServerPensum();
        TextBox miBox = new TextBox();
        static int idPensum;
        bool validacionModificacion = false;
        static Materia miMateriaModificar;
        int semestre;
        
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                try
                {
                    string miRol = (string)Session["rol"];
                    if (miRol != "Escuela")
                        Response.Redirect("../G3AccesoSistema/InicioSistema.aspx");
                    Escuela miEscuela = (Escuela)Session["Usuario"];
                    nombreEscuela.Text = miEscuela.NombreEscuela;
                    Session["idMiEscuela"] = "Escuela: "+miEscuela.IdEscuela;
                }
                catch
                {
                    //mensaje.Text = "Error: no se puede conectar con la base de datos";
                    //mensaje.CssClass = "mensaje";
                    //mensaje.Visible = true;
                }
                //Se inicializan las variables que traen valores de la pagina anterior
                miMateriaModificar = (Materia)Session["materiaModificada"];
                idPensum = (int)Session["idPensum"];
                //Este metedo trae los datos de una Materia(semestre y creditos) por medio del objeto miPrelacion
                //del tipo Prelacion
                miPrelacion = miServer.traerDatosMateriaPensum(miMateriaModificar.Codigo,idPensum);
                int credito = miPrelacion.CreditoMateriaPensum;
                semestre = miPrelacion.SemestreMateriaPensum;
                //Aqui se invoca al metodo que trae las materias que pueden ser preladas por la materia seleccionada
                listaMateria = miServer.materiasNecesarias(idPensum, miMateriaModificar.Nombre);

                //Se hace la llamada para rellenar el primer GridView que contiene la materia elegida
                GridView1.DataSource = cargarMateriaTabla1();
                GridView1.DataBind();
                RecorrerGridViewTextBox(miPrelacion.CreditoMateriaPensum.ToString());
                //Se hace la llamada para rellenar el segundo GridView que corresponde a las materias que pueden ser una
                //prelacion de la materia seleccionada
                GridView8.DataSource = cargarMateriaTabla2(semestre);
                GridView8.DataBind();

                //Se hace la llamada para rellenar el tercer GridView que contiene las actuales prelaciones de la materia
                //seleccionada
                GridView5.DataSource = cargarMateriaTabla3();
                GridView5.DataBind();               
            }
        }

        //Este metodo llena el primer GridView que corresponde a la materia seleccionada
        public DataTable cargarMateriaTabla1()
        {
            // Generar la DataTable de la lista de materias
            DataTable table = new DataTable();
            TextBox miBox = new TextBox();
            //Crea las columnas de la tabla en el GridView
            table.Columns.Add("Materia Seleccionada", typeof(string));
            table.Columns.Add("Codigo", typeof(string));
            //Asigna los valores a la fila, ya que solo se selecciona una materia
            table.Rows.Add(miMateriaModificar.Nombre, miMateriaModificar.Codigo);
            
            return table;
        }

        //Este metodo llena el segundo GridView que corresponde a las posibles prelaciones de la materia seleccionada
        //muestra las materias inferiores al semestre de la materia seleccionada previamente a modificar
        public DataTable cargarMateriaTabla2(int semestre)
        {
            // Generar la DataTable de la lista de materias
            DataTable table2 = new DataTable();
            //LLama al metodo en la base de datos que devuelve las prelaciones posibles de la materia seleccionada
            //Estas materias son asignadas a la lista "misMateriasPensum"
            misMateriasPensum = miServer.devolverPrelaciones(semestre,idPensum);
            //Crea las columnas de la tabla en el GridView
            table2.Columns.Add("Materia", typeof(string));
            table2.Columns.Add("Codigo", typeof(string));
            //Se recorre la lista de materias para ir asignandolas por fila
            for (int indiceDeMaterias = 0; indiceDeMaterias < misMateriasPensum.Count; indiceDeMaterias++)
            {
                table2.Rows.Add(misMateriasPensum[indiceDeMaterias].MiMateriaPensum.Nombre, misMateriasPensum[indiceDeMaterias].MiMateriaPensum.Codigo);
            }
            return table2;
        }
        //Este metodo llena el tercer GridView que es donde se muestran las prelaciones actuales de la materia seleccionada
        public DataTable cargarMateriaTabla3()
        {
            // Generar la DataTable de la lista de materias
            DataTable table3 = new DataTable();
            //Crea las columnas de la tabla en el GridView
            table3.Columns.Add("Materia", typeof(string));
            table3.Columns.Add("Codigo", typeof(string));
            //Se recorre la lista de materias para ir asignandolas por fila
            for (int indiceDeMaterias = 0; indiceDeMaterias < listaMateria.Count; indiceDeMaterias++)
            {
                table3.Rows.Add(listaMateria[indiceDeMaterias].Nombre,listaMateria[indiceDeMaterias].Codigo);
            }

            return table3;
        }

        //Se recorre el primer GridView para asignarle el numero de credito actual de la materia
        public void RecorrerGridViewTextBox(String credito)
        {
            //Se recorre cada fila del GridView en busca del TexBox
            foreach (GridViewRow row in GridView1.Rows)
            {
                miBox = row.FindControl("texbox1") as TextBox;
                //Se le asigna al texbox el credito actual de la materia disponible para modificar
                miBox.Text = credito;
            }
        }
        //Este metodo se encarga de devolver el valor que posee el textbox antes de aceptar la modificacion
        public int DevolverTextBox()
        {
            //Se inicializa el credito
            int credito = 0;
            //Se recorre fila a fila el GridView aunque en este caso el GridView 1 siempre tendra una fila
            foreach (GridViewRow row in GridView1.Rows)
            {
                miBox = row.FindControl("texbox1") as TextBox;
                //Se le asigna el valor del texbox a la variable credito
                credito = Convert.ToInt32(miBox.Text);
            }
            //Retorna el valor que posee el texbox del GridView 1
            return credito;
        }

        //Este metodo devuelve lo seleccionado en el DropDownList(ComboBox) que corresponde al semestre
        public int DevolverDropDownList() 
        {
            int semestre = 0;
            //Se recorre fila a fila el GridView en buscar del "comboSemestre"
            foreach (GridViewRow row in GridView1.Rows)
            {
                DropDownList combo = row.FindControl("comboSemestre") as DropDownList;
                //Asigna el valor encontrado a la variable semestre
                semestre = Convert.ToInt32(combo.SelectedValue);
            }
            //Retorna el semestre seleccionado en el DropDownList
            return semestre;
        }
        //Este metodo se activa cuando se cambia el valor del DropDownList
        public void GridView3_SelectedIndex(object sender, EventArgs e)
        {
            int semestre = 0;
            foreach (GridViewRow row in GridView1.Rows)
            {
                DropDownList combo = row.FindControl("comboSemestre") as DropDownList;
                semestre = Convert.ToInt32(combo.SelectedValue);
                GridView8.DataSource = cargarMateriaTabla2(semestre);
                GridView8.DataBind();
            }
        }
        //Metodo que se encarga de recorrer el GridView de las prelaciones para poderlas asignar a una lista de prelaciones
        public List<Materia> RecorrerGridView2()
        {
            //Se crea una lista de materias que contendra las materias seleccionadas a prelar
            List<Materia> listaMateriaPrelaNueva = new List<Materia>();
            //Se recorre el GridView Fila por fila
            foreach (GridViewRow row in GridView8.Rows)
            {
                Materia materia = new Materia();
                CheckBox _check = row.FindControl("chkSeleccionEscoger") as CheckBox;
                //Si el checkBox fue checkeado se llena el objeto miMateria con el codigo y nombre de la materia
                if (_check.Checked)
                {
                    materia.Nombre = row.Cells[1].Text;
                    materia.Codigo = Convert.ToInt32(row.Cells[2].Text);
                    //Se agrega la materia a la lista
                    listaMateriaPrelaNueva.Add(materia);
                }
            }
            //Devuelve la lista de materias elegidas de la prelacion
            return listaMateriaPrelaNueva;
        }
        //Metodo que se activa al presionar el boton de Modificar 
        public void Boton_Onclick(Object sender, EventArgs e)
        {
            List<Materia> milista = new List<Materia>();
            milista = RecorrerGridView2();
            int credito = DevolverTextBox();
            int semestre = DevolverDropDownList();
            miPrelacion.SemestreMateriaPensum = semestre;
            miPrelacion.CreditoMateriaPensum = credito;
            miPrelacion.MiMateriaPensum = miMateriaModificar;
            //Si hay prelaciones se llena el cambio del objeto prelacion con la lista de materias
            if (GridView8.Enabled)
                miPrelacion.Prelaciones = milista;
            //Sino se le asigna null, es decir que no tiene prelaciones
            else
                miPrelacion.Prelaciones = null;
            //Se llama a la funcion para modificar pensum, si se modifica devolvera true, de lo contrario sera false
            validacionModificacion = miServer.modificarMateriaPensum(miPrelacion,idPensum);
            
            if (validacionModificacion)
                ShowAlertMessage("La modificacion fue realizada con exito");
            else
            {
                mensaje.Text = "Error: no se puede conectar con la base de datos";
                mensaje.CssClass = "mensaje";
                mensaje.Visible = true;
            }
           
        }
            
        //Este metodo se basa en un boton para activar y desactivar el GridView perteneciente a las prelaciones
        public void Boton2_Onclick(Object sender, EventArgs e)
        {
            //Si el GridView no esta disponible al presionar el boton se pone disponible y cambia el texto del boton 
            if (!GridView8.Enabled)
            {          
               GridView8.Enabled = true;
               Habilitar.Text = "Deshabilitar Prelaciones";
                
            }
            //Si el GridView esta disponible al presionar el boton se pone no disponible y cambia el texto del boton 
            else
            {
                GridView8.Enabled = false;
                Habilitar.Text = "Habilitar Prelaciones";
                
            }
        }

        public static void ShowAlertMessage(string error)
        {

            Page page = HttpContext.Current.Handler as Page;
            if (page != null)
            {
                error = error.Replace("'", "\'");
                ScriptManager.RegisterStartupScript(page, page.GetType(), "err_msg", "alert('" + error + "');window.location='../G6Pensum/ListarPensum.aspx';", true);
            }
        }

        protected void GridView3_SelectedIndexChanged(object sender, EventArgs e)
        {

        }



    }
}